package com.geline.mybatisplus.util;

import cn.hutool.core.util.ClassUtil;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

/**
 * Mapper解析工具类
 *
 * @author mx
 * @date 2025/9/12
 */
public class MapperUtil {

    public static <T> Class<T> getEntityClass(String mapperFullName) {
        Class<Object> mapperClass = ClassUtil.loadClass(mapperFullName);
        return getEntityClass(mapperClass);
    }

    /**
     * 根据 Mapper 接口的 Class 对象，获取其对应的 Entity 实体类类型
     *
     * @param mapperClass 自定义的 Mapper 接口 Class（如 UserMapper.class）
     * @return 实体类的 Class 对象，如果无法获取则返回 null
     */
    public static <T> Class<T> getEntityClass(Class<?> mapperClass) {
        Type[] interfaces = mapperClass.getGenericInterfaces();
        for (Type type : interfaces) {
            if (type instanceof ParameterizedType) {
                ParameterizedType parameterizedType = (ParameterizedType) type;
                Type rawType = parameterizedType.getRawType();

                // 判断是否继承了 BaseMapper 或其子接口
                if (rawType.equals(com.baomidou.mybatisplus.core.mapper.BaseMapper.class)) {
                    Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
                    if (actualTypeArguments.length > 0 && actualTypeArguments[0] instanceof Class) {
                        return (Class<T>) actualTypeArguments[0];
                    }
                }
            }
        }

        // 如果没有直接继承 BaseMapper，尝试递归查找父接口
        Class<?> superClass = mapperClass.getSuperclass();
        if (superClass != null && superClass != Object.class) {
            return getEntityClass(superClass);
        }
        return null;
    }
}
